#include "Volador.h"
#include <algorithm>

const vector<int> EstadoVolador::acciones = make_vector<int>() << EstadoBasico::Saltando;
const vector<string> EstadoVolador::descripcionAcciones = make_vector<string>() << "saltar";

Volador::Volador (int x, int y, int maximoX, int maximoY, Orientacion orientacion) : ObjetoMovible(x, y, maximoX, maximoY, orientacion) {

	srand( time(NULL) );
	tiempoNacimiento = 0;
	prioridad = 5;
	tipo = BONUS;
}

void Volador::Actualizar(Uint32 time) {

	if (tiempoNacimiento == 0) tiempoNacimiento = time;

	if (estado == EstadoBasico::Quieto) {

		if (estadoDerecha == SinMovimiento && estadoIzquierda == SinMovimiento) {
			if (rand() % 100 > 50) {
				if (rand() % 100 > 50)
					estadoIzquierda = Empezo;
				else
					estadoDerecha = Empezo;
			}
			else if (time - tiempoNacimiento > TIEMPO_MINIMO_VIDA_VOLADOR)
				setEstadoVida(Muerto);
		}

		else if ( (estadoDerecha == Moviendo && estadoIzquierda == SinMovimiento) ||
			(estadoDerecha == SinMovimiento && estadoIzquierda == Moviendo) ) {
			if (rand() % 100 > 70) {
				estadoIzquierda = SinMovimiento;
				estadoDerecha = SinMovimiento;
			}
		}
	}

	Saltar();

	if (estadoDerecha == Moviendo) {
		MoverDerecha(maximoX, time - lastTimeActualizar);
		if (getPosicion().getX() > maximoX) {
			setEstadoVida(Muerto);
		}
	}

	if (estadoIzquierda == Moviendo) {
		MoverIzquierda(time - lastTimeActualizar);
		if (getPosicion().getX() + ancho < 0){
			setEstadoVida(Muerto);
		}
	}

	if (estadoDerecha == Empezo) {
		estadoDerecha = Moviendo;
	}

	if (estadoIzquierda == Empezo) {
		estadoIzquierda = Moviendo;
	}
}

int Volador::indexEstado(int estado) {

	vector<int> estados = EstadoVolador::acciones;

	unsigned int posicion = find(estados.begin(), estados.end(), estado) - estados.begin();

	if (posicion >= estados.size())
		return -1;

	return posicion;
}

void Volador::Morir() {
	setEstadoVida(Muerto);
}

void Volador::ColisionarConPersonaje (ObjetoEstatico* personaje, int colX, int colY, int colXvieja, int colYvieja) {
	if (!static_cast<Personaje*> (personaje)->getVolatil()) static_cast<Personaje*> (personaje)->setVolatil(true);
	setEstadoVida(Muerto);
}

void Volador::ColisionarConEnemigo(ObjetoEstatico* movible, int colX, int colY, int colXvieja, int colYvieja) {

}
